package handler

import (
	"fmt"
	"go-ws-server/auth"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/gorilla/websocket"

	"go-ws-server/cmd"

	"go-ws-server/ws/manager"
)

var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool { return true },
}

func HandleWebSocket(c *gin.Context) {
	userId := c.Query("userId")

	log.Println("用户登录 userId:", userId)

	if userId == "" {
		c.JSON(400, gin.H{"error": "Missing userId"})
		return
	}

	// 使用userId 校验用户ID，获取用户信息
	userInfo, err := auth.GetUserIdByToken(userId)

	log.Println("登录用户信息为：", userInfo)

	if err != nil {
		c.JSON(000000, gin.H{"error": "用户信息校验失败！"})
		return
	}

	/**
	完成 WebSocket 握手协议

	将标准的 HTTP 连接升级为持久化的 WebSocket 连接

	返回一个 *websocket.Conn 连接对象
	*/
	conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
	if err != nil {
		return
	}

	/** WebSocket 连接注册功能，用于将用户 ID 与其对应的 WebSocket 连接关联存储。 */
	manager.Register(userId, conn)

	/* 在服务关闭前：销毁连接*/
	defer manager.Unregister(userId)

	for {
		_, msg, err := conn.ReadMessage()
		if err != nil {
			fmt.Println("Read error:", err)
			break
		}

		fmt.Printf("收到用户 %s 的消息: %s\n", userId, msg)

		cmd.HandleMessage(userId, msg, conn)

	}
}
